#include "ProtoJson.h"
#include "../net/NetMsg.h"
#include "../lua/LuaRegister.h"

NetMsg* ProtoJson::pack_protocol(lua_State* lua, int index)
{
	for (int i = 1; i < index; i++) {
		lua_remove(lua, i);
	}

	if (!lua_isstring(lua, 1)) {
		return nullptr;
	}
	std::string name = lua_tostring(lua, 1);
	int top = lua_gettop(lua);
	lua_getglobal(lua, "arg_to_encode");
	lua_insert(lua, -top - 1);
	lua_getglobal(lua, "error_handle");
	lua_insert(lua, -top - 2);
	int success = lua_pcall(lua, top, 1, -top - 2);
	if(success != 0) {
		lua_pop(lua, 1);
		return nullptr;
	}

	if (!lua_isstring(lua, -1)) {
		return nullptr;
	}

	size_t len = 0;
	const char* result = lua_tolstring(lua, -1, &len);
	return new NetMsg(MSG_TYPE_JSON, name, result, len);
}

int ProtoJson::unpack_protocol(lua_State* lua, NetMsg* msg)
{
	if (!msg) {
		return 0;
	}
	msg->readHead();
	if (!msg->isVaild()) {
		return 0;
	}
	td_proto::Values raw = td_proto::decode_str_raw(*msg, td_proto::TYPE_RAW);
	if (raw.sub_type != td_proto::TYPE_RAW) {
		return 0;
	}
	lua_pushstring(lua, msg->packName.c_str());
	LuaRegister::pushValues(lua, raw);
	return 2;
}
